/*
 * @Description:
 * @Author: chenjiaxin
 * @Date: 2022-02-26 18:35:15
 * @LastEditTime: 2022-02-27 15:23:52
 * @FilePath: \nitem\src\index.js
 */

class Nitem {
  constructor() {
    this.eventBus = {};
  }
  /**
   * 监听事件
   * @param {String} eventName 事件名称
   * @param {Function} eventCallBack 事件回调函数
   * @param {Object} thisArg 改变回调函数this指向
   */
  on(eventName, eventCallBack, thisArg) {
    let handler = this.eventBus[eventName];
    if (!handler) {
      handler = [];
      this.eventBus[eventName] = handler;
    }
    handler.push({
      eventCallBack,
      thisArg
    });
  }
  /**
   * 发射事件
   * @param {String} eventName 发射事件名称
   * @param  {...any} payload 参数
   * @returns
   */
  emit(eventName, ...payload) {
    let handler = this.eventBus[eventName];
    if (!handler) return;

    handler.forEach((item) => {
      // console.log(item);
      let { eventCallBack, thisArg } = item;
      eventCallBack.apply(thisArg || globalThis, payload);
      // eventCallBack(...payload);
    });
  }
  /**
   * 移除 事件
   * @param {String} eventName 事件名称
   * @param {Function} eventCallBack 事件回调函数
   * @returns
   */
  off(eventName, eventCallBack) {
    let handlers = this.eventBus[eventName];
    // debugger;
    if (!handlers) return;
    let length = handlers.length;
    for (let index = 0; index < length; index++) {
      const element = handlers[index];
      if (element.eventCallBack === eventCallBack) {
        handlers.splice(index, 1);
      }
    }
  }
  /**
   * 清除所有事件
   * @param {Array} eventNames 事件名称
   */
  clear(eventNames) {
    if (!eventNames) {
      //清除全部
      this.eventBus = {};
      return;
    }
    if (!Array.isArray(eventNames)) {
      throw "类型错误";
    }
    eventNames.forEach((eventName) => {
      delete this.eventBus[eventName];
    });
  }
}
// const Nitem = new Nitem();
export default Nitem;
